/**
 * ClassName 权限控制器
 */
Ext.define("app.controller.AuthController",{	
	extend:'Ext.app.Controller',

	views:[
		'auth.User',//用户列表
		'auth.UserGroup',//给用户设置用户组（添加或者修改）
		'auth.Rule',//规则列表
	    'auth.RuleOperation',//添加和修改规则的window	   
	    'auth.Group',//角色
	    'auth.GroupOperation',//添加和修改用户组的window	
	    'auth.AssignGroupRule',//给用户组分配权限规则
	      
	],
	stores:[
	    'AuthUserStore',//获取用户列表
	    'AuthRuleStore',//获取规则列表
	    'AuthGroupStore',//获取用户组列表
	],
	
	init: function(){
		this.control({
			//用户列表，双击某一行后弹窗，设置用户组（不用于修改用户，用于设置或修改用户所属用户组）
			'authuser': {
				itemdblclick: 'dblUserGroupWin'
			},

			//用户列表，设置用户组的按钮，点击弹窗
			'authuser button[action=assignUserGroup]': {
				click: 'userGroupWin'
			},

			//用户设置用户组的window内，点击“确定按钮”，提交表单
			'authusergroup button[action=userGroupFormSubmit]': {
				click: 'userGroupFormSubmit'
			},

			//规则列表，双击某一行后弹窗，修改规则
			'authrule': {
				itemdblclick: 'dblModifyRuleWin'
			},

			//规则列表，修改规则的按钮，点击弹窗
			'authrule button[action=modifyRule]': {
				click: 'modifyRuleWin'
			},

			//规则列表，添加规则的按钮，点击弹窗
			'authrule button[action=addRule]': {
				click: 'addRuleWin'
			},

			//规则列表，删除规则的按钮，发送删除请求
			'authrule button[action=removeRule]': {
				click: 'removeRule'
			},

			//添加、修改规则的win下的“确定”按钮，提交表单
			'ruleoperation button[action=ruleFormSubmit]': {
				click: 'ruleFormSubmit'
			},

			//用户组列表，双击某一行后弹窗，只用于修改用户组信息，不用于修改该组的权限规则
			'authgroup': {
				itemdblclick: 'dblModifyGroupWin'
			},

			//用户组列表，修改用户组的按钮，点击弹窗
			'authgroup button[action=modifyGroup]': {
				click: 'modifyGroupWin'
			},

			//用户组列表，添加用户组的按钮，点击弹窗
			'authgroup button[action=addGroup]': {
				click: 'addGroupWin'
			},

			//用户组列表，删除用户组的按钮，发送删除请求
			'authgroup button[action=removeGroup]': {
				click: 'removeGroup'
			},

			//用户组列表，点击“设置用户组的权限规则”按钮，弹窗
			'authgroup button[action=assignGroupRule]': {
				click: 'assignGroupRule'
			},

			//添加、修改用户组的win下的“确定”按钮，提交表单
			'groupoperation button[action=groupFormSubmit]': {
				click: 'groupFormSubmit'
			},

			//给用户组分配规则的win下的“确定”按钮，提交表单
			'assigngrouprule button[action=groupRuleFormSubmit]': {
				click: 'groupRuleFormSubmit'
			},

			//给用户组分配规则的win下的“全选/全不选”复选框，全选或者全不选所有规则的复选框
			'assigngrouprule checkbox[name=toggleAction]': {
				change: 'toggleAction'				
			}
		});
	},

	// 提取出来的内容，供下面两个方法共用
	// objParam对象只有一个属性，在dblUserGroupWin方法内，{record: record}值就是dblUserGroupWin方法的第二个参数；在userGroupWin方法内，值就是rows[0]。
	userGroupOperation: function(objParam){
		//组装参数对象
		var obj = {
			url: ROOT +'/index.php/Home/Auth/userGroup',
			params: {action: 'getGroup', uid: objParam.record.get('id')},//当前要分配用户组的用户id，用于先取出该用户所属用户组，便于管理员修改和分配新用户组
			func: function(records){
				//参数records是数组，就是Ext.decode(response.responseText);
				
				// 给用户设置用户组的表单所在的window组件
				var win = Ext.widget('authusergroup');
				
				
				//将用户的id赋值给隐藏域
				win.down('hidden').setValue(objParam.record.get('id'));
				
				//存放复选框
				var checkArray = [];
				// 每个对象形式：{id: "3", title: "超级管理员", checked: false}
				for(var i = 0;i < records.length;i++){
					checkArray.push({
						boxLabel: records[i].title,
						name: 'userGroupIds[]',
						inputValue: records[i].id,
						checked: records[i].checked
					});
				}
				// checkboxgroup组件对象
				var itemsGroup = new Ext.form.CheckboxGroup({
					fieldLabel: '用户组列表',			
					labelWidth: 100,
					columns: 1,
					items: checkArray
				});
				// checkboxgroup组件对象添加到form表单中
				win.down('form').add(itemsGroup);
				// 弹窗显示
				win.show();
			}
		};
		//发送请求
		smsObj.ajax(obj);
	},

	//用户列表，双击某一行后弹窗，设置用户组（不用于修改用户，用于设置或修改用户所属用户组）
	dblUserGroupWin: function(grid, record){
		// 这里的内容，是下面一个方法userGroupWin中的一部分，应该进行提取，提取后的内容见上面一个方法
		this.userGroupOperation({record: record});
	},
	
	//选择一行后点击了“设置用户组”按钮，设置或者修改用户所在的用户组
	userGroupWin: function(btn){
		
		//如果没有选中某个用户，提示并结束
		var grid = btn.ownerCt.ownerCt;
		//选中的行
		var rows = grid.getSelectionModel().getSelection();
		if(rows.length != 1){
			Ext.Msg.alert('警告','请选择一个用户~');
			return;
		}

		this.userGroupOperation({record: rows[0]});

		// 这个位置的内容，被上面一个方法完全使用了，应该进行提取，提取后的内容见最上面一个方法
	},
	
	//给用户设置用户组（包括修改）的window，点击‘确定’，向后台发送该用户的用户组数据
	userGroupFormSubmit: function(btn){		
		//表单所在的window组件
		var win = btn.ownerCt;
		//组装参数对象
		var obj = {
			form: win.down('form'),
			win: win,
			url: ROOT +'/index.php/Home/Auth/userGroup',
			params: {action: 'setGroup'},//当前要分配用户组的用户id，用于先取出该用户已有用户组，便于管理员修改和分配新用户组
			func: function(win){
				Ext.Msg.alert('恭喜', '分配用户组成功~', function(){
					//销毁window组件
					win.destroy();
				});
			}
		};
		//提交表单
		smsObj.submit(obj);		
	},

	//双击行后弹窗修改规则
	dblModifyRuleWin: function(grid, record, aa){
		//window组件
		var win = Ext.widget('ruleoperation');
		// 弹窗中的表单加载对应行的数据
		win.down('form').loadRecord(record);
		// 弹窗显示
		win.show();
	},

	//修改规则（双击规则行或者选中一行后点击了“修改规则”按钮）
	//双击行时，参数btn不存在，但不会报错
	modifyRuleWin: function(btn){
		//grid组件
		var grid = btn.ownerCt.ownerCt;
		//如果没有选中某个规则，提示并结束		
		//选中的行
		var rows = grid.getSelectionModel().getSelection();
		if(rows.length != 1){
			Ext.Msg.alert('警告','请选择一个要修改的规则~');
			return;
		}	

		var win = Ext.widget('ruleoperation');
		// 弹窗中的表单加载选中行的数据
		win.down('form').loadRecord(rows[0]);
		// 弹窗显示
		win.show();
	},

	//点击了“添加规则”按钮后弹窗
	addRuleWin: function(btn){
		// 弹窗的window组件
		var win = Ext.widget('ruleoperation');
		// 禁用弹窗中表单组件的id控件
		win.down('form').down('textfield[name=id]').disable();
		// 隐藏弹窗中表单组件的id控件
		win.down('form').down('textfield[name=id]').hide();
		// 弹窗显示
		win.show();
	},

	//选中规则后，点击“删除规则”执行
	removeRule: function(btn){
		//grid组件
		var grid = btn.ownerCt.ownerCt;
		
		//选中的行
		var rows = grid.getSelectionModel().getSelection();
		//如果没有选中的行，提示并结束	
		if(rows.length < 1){
			Ext.Msg.alert('警告','请选择至少一个要删除的规则~');
			return;
		}
		// 删除前进行提示
		Ext.Msg.confirm('确认', '确定要删除么？' , function(btn){
			if(btn == 'yes'){
				//存放删除规则的id的数组
				var ids = [];
				for(var i=0; i<rows.length; i++){
					ids.push(rows[i].get('id'));
				}
				
				//组装参数对象
				var obj = {
					url: ROOT + '/index.php/Home/Auth/ruleOperation',
					params: {action: 'remove', ids: ids.join(',')},//id数组转为字符串，方便后台in操作
					store: grid.getStore(),//成功后grid需要进行重载数据，需要这个store
					func: function(resObj, store){											
						Ext.Msg.alert('恭喜', resObj.msg, function(){				        
					        // 发送请求，重载数据	
					        store.load();
						});	
					}
				};
				//发送请求。smsObj是一个定义的全局工具对象，内部封装了几个方法
				smsObj.ajax(obj);
			}
		});	
	},


	//添加、修改规则的win下的“确定”按钮，提交表单
	ruleFormSubmit: function(btn){
		// 此表单所在window组件
		var win = btn.up('window');
		//组装参数对象
		var obj = {
			form: win.down('form'),
			win: win,
			url: ROOT + '/index.php/Home/Auth/ruleOperation',
			params: {action: 'addOrModify'},
			funcType: 'refresh',//表示本window关闭后，还要刷新grid中store
			func: function(win, action){
				Ext.Msg.alert('恭喜', action.result.msg, function(){
					//因为总是新建window组件，所以这里不使用hide，而是destroy或者close（默认==destroy）
					win.destroy();
			        
			        //重新load一下store，更新节点最新数据
			        Ext.getCmp('authrule').getStore().load();
				});	
			}
		};
		//提交表单
		smsObj.submit(obj);
	},

	// 双击行修改用户组
	dblModifyGroupWin: function(grid, record){
		//window组件
		var win = Ext.widget('groupoperation');
		// 弹窗中的表单加载对应行的数据
		win.down('form').loadRecord(record);
		// 弹窗显示
		win.show();
	},

	//修改用户组
	modifyGroupWin: function(btn){
		//grid组件
		var grid = btn.ownerCt.ownerCt;
		//如果没有选中某个用户组，提示并结束		
		//选中的行
		var rows = grid.getSelectionModel().getSelection();
		if(rows.length != 1){
			Ext.Msg.alert('警告','请选择一个要修改的规则~');
			return;
		}

		var win = Ext.widget('groupoperation');
		// 弹窗中的表单加载选中行的数据
		win.down('form').loadRecord(rows[0]);
		// 弹窗显示
		win.show();
	},

	//添加用户组
	addGroupWin: function(btn){
		// 弹窗的window组件
		var win = Ext.widget('groupoperation');
		// 禁用弹窗中表单组件的id控件
		win.down('form').down('textfield[name=id]').disable();
		// 隐藏弹窗中表单组件的id控件
		win.down('form').down('textfield[name=id]').hide();
		// 弹窗显示
		win.show();
	},

	//删除用户组
	removeGroup: function(btn){
		//grid组件
		var grid = btn.ownerCt.ownerCt;
		
		//选中的行
		var rows = grid.getSelectionModel().getSelection();
		//如果没有选中的行，提示并结束	
		if(rows.length < 1){
			Ext.Msg.alert('警告','请选择至少一个要删除的用户组~');
			return;
		}
		// 删除前进行提示
		Ext.Msg.confirm('确认', '确定要删除么？' , function(btn){
			if(btn == 'yes'){
				//存放删除用户组的id的数组
				var ids = [];
				for(var i=0; i<rows.length; i++){
					ids.push(rows[i].get('id'));
				}
				
				//组装参数对象
				var obj = {
					url: ROOT + '/index.php/Home/Auth/groupOperation',
					params: {action: 'remove', ids: ids.join(',')},//id数组转为字符串，方便后台in操作
					store: grid.getStore(),//成功后grid需要进行重载数据，需要这个store
					func: function(resObj, store){
						Ext.Msg.alert('恭喜', resObj.msg, function(){
							// 发送请求，重载数据	
					        store.load();
						});	
					}
				};
				//发送请求。smsObj是一个定义的全局工具对象，内部封装了几个方法
				smsObj.ajax(obj);
			}
		});	
	},

	//添加、修改用户组的win下的“确定”按钮，提交表单
	groupFormSubmit: function(btn){
		// 此表单所在window组件
		var win = btn.up('window');
		//组装参数对象
		var obj = {
			form: win.down('form'),
			win: win,
			url: ROOT + '/index.php/Home/Auth/groupOperation',
			params: {action: 'addOrModify'},
			funcType: 'refresh',//表示本window关闭后，还要刷新grid中store
			func: function(win, action){
				Ext.Msg.alert('恭喜', action.result.msg, function(){
					//因为总是新建window组件，所以这里不使用hide，而是destroy或者close（默认==destroy）
					win.destroy();
			        
			        //重新load一下store，更新节点最新数据
			        Ext.getCmp('authgroup').getStore().load();
				});	
			}
		};
		//提交表单
		smsObj.submit(obj);
	},

	// 设置用户组的权限规则
	assignGroupRule: function(btn){
		//grid组件
		var grid = btn.ownerCt.ownerCt;
		//如果没有选中某个用户组，提示并结束		
		//选中的行
		var rows = grid.getSelectionModel().getSelection();
		if(rows.length != 1){
			Ext.Msg.alert('警告','请选择一个用户组~');
			return;
		}

		// ①获取所有规则
		// ②获取所有该用户组已拥有的规则，选中
		// ③动态添加到form下的checkboxgroup组件中

		//组装参数对象
		var obj = {
			url: ROOT +'/index.php/Home/Auth/groupRule',
			params: {action: 'getRules', gid: rows[0].get('id')},//选中的用户组的id
			// 请求成功后再success内执行的方法
			func: function(records){
				//参数records是数组，就是Ext.decode(response.responseText);

				// 给用户组分配规则的表单所在的window组件
				var win = Ext.widget('assigngrouprule');
				//将用户组的id赋值给隐藏域
				win.down('hidden').setValue(rows[0].get('id'));

				//存放复选框
				var checkArray = [];

				// 每个对象形式：{id: "3", name: "Area", title: "查看员工地区分布", checked: true}
				for (var i = 0; i < records.length; i++) {
					checkArray.push({
						boxLabel: records[i].title,
						name: 'ruleIds[]',
						inputValue: records[i].id,
						checked: records[i].checked
					});
				};
				// checkboxgroup组件对象
				var itemsGroup = new Ext.form.CheckboxGroup({
					fieldLabel: '规则列表',			
					labelWidth: 100,
					columns: 3,
					items: checkArray
				});
				// checkboxgroup组件对象添加到form表单中
				win.down('form').add(itemsGroup);
				// 弹窗显示
				win.show();
			}			
		};
		//发送请求
		smsObj.ajax(obj);
	},

	//给用户组分配规则的win下的“确定”按钮，提交表单
	groupRuleFormSubmit: function(btn){
		// 此表单所在window组件
		var win = btn.up('window');
		//组装参数对象
		var obj = {
			form: win.down('form'),
			win: win,
			url: ROOT + '/index.php/Home/Auth/groupRule',
			params: {action: 'setRules'},			
			func: function(win, action){
				Ext.Msg.alert('恭喜', action.result.msg, function(){
					//因为总是新建window组件，所以这里不使用hide，而是destroy或者close（默认==destroy）
					win.destroy();
				});	
			}
		};
		//提交表单
		smsObj.submit(obj);
	},

	//给用户组分配规则的win下的“全选/全不选”复选框，全选或者全不选所有规则的复选框
	toggleAction: function( thiss, newValue, oldValue, eOpts ){
		// win组件
		var win = thiss.up('window');
		win.down('form').down('checkboxgroup').items.each(function(obj){
			obj.setValue(newValue)
		});

	}
});